1
2
3
Il prossimo
Annulla un commit e ripeti
$ git commit -m "Qualcosa di terribilmente fuorviante" # (0: Il tuo incidente)
$ git reset HEAD ~ # (1)
<< modifica i file secondo necessità >> # (2)
$ git add. # (3)
$ git commit -c ORIG_HEAD # (4)
Questo comando è responsabile dell'annullamento. Annullerà il tuo ultimo commit lasciando intatto il tuo albero di lavoro (lo stato dei tuoi file su disco). Dovrai aggiungerli di nuovo prima di poterli eseguire nuovamente).
Apporta correzioni ai file dell'albero di lavoro.
git aggiungi tutto ciò che desideri includere nel tuo nuovo commit.
Effettua il commit delle modifiche, riutilizzando il vecchio messaggio di commit. reset ha copiato la vecchia testina in .git / ORIG_HEAD; commit con -c ORIG_HEAD aprirà un editor, che inizialmente contiene il messaggio di log del vecchio commit e ti permette di modificarlo. Se non è necessario modificare il messaggio, è possibile utilizzare l'opzione -C.
In alternativa, per modificare il commit precedente (o solo il suo messaggio di commit), commit --amend aggiungerà modifiche all'interno dell'indice corrente al commit precedente.
Per rimuovere (non ripristinare) un commit che è stato inviato al server, è necessario riscrivere la cronologia con git push origin master --force.
Ulteriori letture
Come posso riportare HEAD in una posizione precedente? (Testa staccata) e Annulla commit
La risposta sopra ti mostrerà git reflog, che puoi usare per determinare SHA-1 per il commit a cui desideri tornare. Una volta ottenuto questo valore, utilizzare la sequenza di comandi come spiegato sopra.
HEAD ~ è uguale a HEAD ~ 1. L'articolo Cos'è l'HEAD in git? è utile se desideri annullare il commit di più commit.
|
Annullare un commit fa un po 'paura se non sai come funziona. Ma in realtà è sorprendentemente facile se capisci. Ti mostrerò i 4 diversi modi in cui puoi annullare un commit.
opzione 1: git reset --hard
Diciamo che hai questo, dove C è la tua TESTA e (F) è lo stato dei tuoi file.
(F)
A-B-C
↑
maestro
Vuoi eseguire il commit nucleare C e non vederlo mai più e perdere tutte le modifiche nei file modificati localmente. Tu lo fai:
git reset --hard HEAD ~ 1
Il risultato è:
(F)
A-B
↑
maestro
Ora B è la TESTA. Poiché hai usato --hard, i tuoi file vengono ripristinati al loro stato al commit B.
opzione 2: git reset
Ah, ma supponiamo che il commit C non sia stato un disastro, ma solo un po 'strano. Vuoi annullare il commit ma conservare le modifiche per un po 'di modifica prima di eseguire un commit migliore. Ripartendo da qui, con C come TESTA:
(F)
A-B-C
↑
maestro
Puoi farlo, lasciando fuori il --hard:
git reset HEAD ~ 1
In questo caso il risultato è:
(F)
A-B-C
↑
maestro
In entrambi i casi, HEAD è solo un puntatore all'ultimo commit. Quando esegui un git reset HEAD ~ 1, dici a Git di spostare il puntatore HEAD indietro di un commit. Ma (a meno che non usi --hard) lasci i tuoi file come erano. Quindi ora git status mostra le modifiche che avevi archiviato in C. Non hai perso nulla!
opzione 3: git reset --soft
Per il tocco più leggero, puoi persino annullare il tuo commit ma lasciare i tuoi file e il tuo indice:
git reset --soft HEAD ~ 1
Questo non solo lascia i tuoi file da soli, ma lascia anche il tuo indice da solo. Quando esegui git status, vedrai che gli stessi file sono nell'indice di prima. In effetti, subito dopo questo comando, potresti eseguire git commit e rifaresti lo stesso commit che hai appena avuto.
opzione 4: hai fatto git reset --hard e devi recuperare quel codice
Un'altra cosa: supponi di distruggere un commit come nel primo esempio, ma poi scopri che dopo tutto ne avevi bisogno? Fortuna, vero?
No, c'è ancora un modo per riaverlo. Digita git reflog e vedrai un elenco di commit (parziali) sha (cioè hash) in cui ti sei spostato. Trova il commit che hai distrutto e fai questo:
git checkout -b someNewBranchName shaYouDestroyed
Ora hai resuscitato quel commit. I commit non vengono effettivamente distrutti in Git per circa 90 giorni, quindi di solito puoi tornare indietro e salvarne uno di cui non intendevi sbarazzarti.
|
Ci sono due modi per "annullare" il tuo ultimo commit, a seconda che tu abbia già reso pubblico o meno il tuo commit (inviato al tuo repository remoto):
Come annullare un commit locale
Diciamo che ho eseguito il commit a livello locale, ma ora voglio rimuovere quel commit.
git log
commit 101: bad commit # Ultimo commit. Questo sarebbe chiamato "TESTA".
commit 100: buon commit # Dal secondo all'ultimo commit. Questo è quello che vogliamo.
Per ripristinare tutto come prima dell'ultimo commit, dobbiamo ripristinare il commit prima di HEAD:
git reset --soft HEAD ^ # Usa --soft se vuoi mantenere le modifiche
git reset --hard HEAD ^ # Usa --hard se non ti interessa mantenere le modifiche che hai fatto
Ora git log mostrerà che il nostro ultimo commit è stato rimosso.
Come annullare un commit pubblico
Se hai già reso pubblici i tuoi commit, vorrai creare un nuovo commit che "annullerà" le modifiche che hai fatto nel tuo precedente commit (attuale HEAD).
git ripristina HEAD
Le tue modifiche verranno ora annullatee pronto per il tuo impegno:
git commit -m 'ripristino del file che ho rimosso per sbaglio'
git log
commit 102: ripristino del file rimosso per errore
commit 101: rimuovere un file che non ci serve
commit 100: aggiunta di un file di cui abbiamo bisogno
Per ulteriori informazioni, consulta Git Basics - Undoing Things.
|
Aggiungi / rimuovi file per ottenere le cose nel modo desiderato:
git rm classdir
git aggiungi sourcedir
Quindi modifica il commit:
git commit --amend
Il precedente commit errato verrà modificato per riflettere il nuovo stato dell'indice, in altre parole, sarà come se non avessi mai commesso l'errore in primo luogo.
Nota che dovresti farlo solo se non hai ancora eseguito il push. Se hai eseguito il push, dovrai solo eseguire il commit di una correzione normalmente.
|
git rm yourfiles / *. class
git commit -a -m "ha cancellato tutti i file di classe nella cartella" yourfiles ""
o
git reset --hard HEAD ~ 1
Avviso: il comando precedente rimuoverà in modo permanente le modifiche ai file .java (e qualsiasi altro file) che si desidera eseguire il commit.
L'hard reset su HEAD-1 imposterà la tua copia di lavoro allo stato del commit prima del commit sbagliato.
|
Per modificare l'ultimo commit
Sostituisci i file nell'indice:
git rm --cached * .class
git add * .java
Quindi, se si tratta di un ramo privato, modifica il commit:
git commit --amend
Oppure, se è un ramo condiviso, crea un nuovo commit:
git commit -m 'Sostituisci i file .class con i file .java'
(Per modificare un commit precedente, usa il fantastico rebase interattivo.)
ProTip ™: aggiungi * .class a un gitignore per impedire che ciò accada di nuovo.
Per annullare un commit
Modificare un commit è la soluzione ideale se è necessario modificare l'ultimo commit, ma viene ripristinata una soluzione più generale.
Puoi reimpostare Git su qualsiasi commit con:
git reset @ ~ N
Dove N è il numero di commit prima di HEAD e @ ~ ripristina il commit precedente.
Quindi, invece di modificare il commit, potresti usare:
git reset @ ~
git add * .java
git commit -m "Aggiungi file .java"
Dai un'occhiata a git help reset, in particolare le sezioni su --soft --mixed e --hard, per una migliore comprensione di cosa fa.
Reflog
Se sbagli, puoi sempre utilizzare il reflog per trovare i commit eliminati:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: reset: passaggio a @ ~
2c52489 HEAD @ {1}: commit: aggiunti alcuni file .class
$ git reset 2c52489
... e sei tornato da dove hai iniziato
|
Usa git revert .
Per ottenere l'ID del commit, usa git log.
|
Se hai intenzione di annullare completamente un commit locale, qualunque cosa tu modifichi l'hai fatto sul commit e se non ti preoccupi di nulla, esegui semplicemente il comando seguente.
git reset --hard HEAD ^ 1
(Questo comando ignorerà l'intero commit e le modifiche verranno perse completamente dall'albero di lavoro locale). Se vuoi annullare il tuo commit, ma vuoi le tue modifiche nell'area di staging (prima del commit proprio come dopo git add) allora esegui il seguente comando.
git reset --soft HEAD ^ 1
Ora i tuoi file salvati entrano nell'area di staging. Supponi di voler mettere in secondo piano i file, perché devi modificare del contenuto sbagliato, quindi esegui il seguente comando
git resetta HEAD
Ora i file sottoposti a commit provengono dall'area gestita nell'area non gestita. Ora i file sono pronti per la modifica, quindi qualunque cosa tu modifichi, vuoi andare a modificarlo e aggiungerlo e fare un nuovo commit.
Altro (collegamento interrotto) (versione archiviata)
|
Se hai Git Extras installato, puoi eseguire git undo per annullare l'ultimo commit. git undo 3 annullerà gli ultimi tre commit.
|
Volevo annullare gli ultimi cinque commit nel nostro repository condiviso. Ho cercato l'ID di revisione a cui volevo eseguire il rollback. Quindi ho digitato quanto segue.
prompt> git reset --hard 5a7404742c85
HEAD è ora al 5a74047 Aggiunta un'altra pagina al catalogo
prompt> git push origin master --force
Totale 0 (delta 0), riutilizzato 0 (delta 0)
remote: bb / acl: neoneye è consentito. carico utile accettato.
A git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 master -> master (aggiornamento forzato)
prompt>
|
Preferisco usare git rebase -i per questo lavoro, perché viene visualizzato un bel elenco in cui posso scegliere i commit di cui sbarazzarmi. Potrebbe non essere così diretto come alcune altre risposte qui, ma sembra giusto.
Scegli quanti commit vuoi elencare, quindi invoca in questo modo (per arruolare gli ultimi tre)
git rebase -i HEAD ~ 3
Elenco dei campioni
pick aa28ba7 Controllo di integrità per la porta RtmpSrv
scegli l'opzione versione c26c541 RtmpSrv
scegli 58d6909 Migliore supporto per la decodifica degli URL
Quindi Git rimuoverà i commit per ogni riga che rimuovi.
|
Come correggere il precedente commit locale
Usa git-gui (o simile) per eseguire un commit git --amend. Dalla GUI è possibile aggiungere o rimuovere singoli file dal commit. Puoi anche modificare il messaggio di commit.
Come annullare il commit locale precedente
Ripristina semplicemente il tuo ramo nella posizione precedente (ad esempio, usando gitk o git rebase). Quindi riapplica le modifiche da una copia salvata. Dopo la garbage collection nel tuo repository locale, sarà come se il commit indesiderato non fosse mai avvenuto. Per fare tutto questo in un unico comando, usa git reset HEAD ~ 1.
paroladi avvertimento: l'uso incauto di git reset è un buon modo per portare la tua copia di lavoro in uno stato confuso. Raccomando ai principianti di Git di evitarlo se possono.
Come annullare un commit pubblico
Esegui una selezione inversa (git-revert) per annullare le modifiche.
Se non hai ancora apportato altre modifiche al tuo ramo, puoi semplicemente fare ...
git revert --no-edit HEAD
Quindi invia il tuo ramo aggiornato al repository condiviso.
La cronologia dei commit mostrerà entrambi i commit, separatamente.
Avanzato: correzione del ramo privato nel repository pubblico
Questo può essere pericoloso: assicurati di avere una copia locale del ramo da ripagare.
Nota anche: non vuoi farlo se qualcun altro sta lavorando sul ramo.
git push --delete (branch_name) ## rimuove la versione pubblica del branch
Ripulisci il tuo ramo localmente, quindi ripeti ...
git push origin (branch_name)
Nel caso normale, probabilmente non devi preoccuparti che la cronologia dei commit del tuo ramo privato sia incontaminata. È sufficiente eseguire il push di un commit di follow-up (vedere "Come annullare un commit pubblico" sopra) e, successivamente, eseguire una fusione di squash per nascondere la cronologia.
|
Se vuoi annullarlo definitivamente e hai clonato qualche repository
L'ID commit può essere visto da
git log
Allora puoi fare -
git reset --hard
git push origin -f
|
Se hai commesso spazzatura ma non spinto,
git reset --soft HEAD ~ 1
HEAD ~ 1 è una scorciatoia per il commit prima di head. In alternativa puoi fare riferimento allo SHA-1 dell'hash se vuoi reimpostare. - L'opzione --soft cancellerà il commit ma lascerà tutti i tuoi file modificati "Modifiche da confermare", come direbbe git status.
Se vuoi sbarazzarti di tutte le modifiche ai file tracciati nell'albero di lavoro dal commit prima di head, usa invece "--hard".
O
Se hai già premuto e qualcuno ha tirato, come di solito è il mio caso, non puoi usare git reset. Puoi comunque fare un ripristino git,
git ripristina HEAD
Questo creerà un nuovo commit che inverte tutto ciò che è stato introdotto dal commit accidentale.
|
Su SourceTree (GUI per GitHub), puoi fare clic con il pulsante destro del mouse sul commit ed eseguire un "Reverse Commit". Questo dovrebbe annullare le modifiche.
Sul terminale:
In alternativa puoi usare:
git revert
O:
git reset --soft HEAD ^ # Usa --soft se vuoi mantenere le modifiche.
git reset --hard HEAD ^ # Usa --hard se non ti interessa mantenere le modifiche.
|
Un unico comando:
git reset - soft 'HEAD ^'
Funziona benissimo per annullare l'ultimo commit locale!
|
Basta ripristinarlo eseguendo il comando seguente usando git:
git reset --soft HEAD ~ 1
Spiega: cosa fa git reset, è fondamentalmente reimpostato su qualsiasi commit a cui desideri tornare, quindi se lo combini con il tasto --soft, tornerà indietro, ma manterrai le modifiche nei tuoi file, quindi torni alla fase in cui il file è stato appena aggiunto, HEAD è il capo del ramo e se combini con ~ 1 (in questo caso usi anche HEAD ^), tornerà indietro solo un commit che è quello che vuoi. ..
Creo i passaggi nell'immagine qui sotto in modo più dettagliato per te, inclusi tutti i passaggi che possono verificarsi in situazioni reali e il commit del codice:
|
Come annullare l'ultimo commit Git?
Per ripristinare tutto come prima dell'ultimo commit, è necessario ripristinare il commit prima di HEAD.
Se non desideri conservare le modifiche apportate:
git reset --hard HEAD ^
Se vuoi mantenere le tue modifiche:
git reset --soft HEAD ^
Ora controlla il tuo registro git. Mostrerà che il nostro ultimo commit è stato rimosso.
|
"Reimposta l'albero di lavoro all'ultimo commit"
git reset --hard HEAD ^
"Elimina i file sconosciuti dall'albero di lavoro"
git clean
vedi - Guida rapida di Git
NOTA: questo comando eliminerà il commit precedente, quindi usalo con cautela! git reset --hard è più sicuro.
|
Usa reflog per trovare uno stato corretto
git reflog
RIFLOGGIARE PRIMA DEL RESET
Seleziona il reflog corretto (f3cb6e2 nel mio caso) e digita
git reset --hard f3cb6e2
Dopodiché, il repository HEAD verrà reimpostato su tale HEADid
LOG DOPO IL RESET
Infine il reflog ha l'aspetto dell'immagine qui sotto
REFLOG FINALE
|
Prima corsa:
git reflog
Ti mostrerà tutte le possibili azioni che hai eseguito sul tuo repository, ad esempio commit, merge, pull, ecc.
Quindi fa:
git reset --hard ActionIdFromRefLog
|
Annulla ultimo commit:
git reset --soft HEAD ^ o git reset --soft HEAD ~
Questo annullerà l'ultimo commit.
Qui - soft significa reimpostare in staging.
HEAD ~ o HEAD ^ significa spostarsi per eseguire il commit prima di HEAD.
Sostituisci l'ultimo commit con un nuovo commit:
git commit --amend -m "messaggio"
Sostituirà l'ultimo commit con il nuovo commit.
|
Un altro modo:
Effettua il checkout del ramo che desideri ripristinare, quindi reimposta la tua copia di lavoro locale sul commit che desideri sia l'ultimo sul server remoto (tutto ciò che dopo andrà addio). Per fare ciò, in SourceTree ho fatto clic con il pulsante destro del mouse su e ho selezionato "Reimposta BRANCHNAME su questo commit".
Quindi vai alla directory locale del tuo repository ed esegui questo comando:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEBRANCHNAME: BRANCHNAME
Questo cancellerà tutti i commit dopo quello corrente nel tuo repository locale ma solo per quel ramo.
|
Digita git log e trova l'ultimo codice hash di commit, quindi inserisci:
git reset
|
Nel mio caso ho salvato accidentalmente alcuni file che non volevo. Quindi ho fatto quanto segue e ha funzionato:
git reset --soft HEAD ^
git rm --cached [file che non ti servono]
git aggiungi [file che ti servono]
git commit -c ORIG_HEAD
Verifica i risultati con gitk o git log --stat
|
Semplice, eseguilo nella riga di comando:
git reset --soft HEAD ~
|
Esistono due scenari principali
Non hai ancora eseguito il commit
Se il problema erano file extra che hai inserito (e non vuoi quelli nel repository), puoi rimuoverli usando git rm e poi impegnandoti con --amend
git rm
Puoi anche rimuovere intere directory con -r, o anche combinarle con altri comandi Bash
git rm -r
git rm $ (trova -name '* .class')
Dopo aver rimosso i file, puoi eseguire il commit, con l'opzione --amend
git commit --amend -C HEAD # l'opzione -C serve per usare lo stesso messaggio di commit
Questo riscriverà il tuo recente commit locale rimuovendo i file extra, quindi questi file non verranno mai inviati in push e verranno rimossi dal tuo repository .git locale da GC.
Hai già eseguito il commit
Puoi applicare la stessa soluzione dell'altro scenario e quindi eseguire git push con l'opzione -f, ma non è consigliato poiché sovrascrive la cronologia remota con una modifica divergente (può rovinare il tuo repository).
Invece, devi fare il commit senza --amend (ricorda questo riguardo -amend`: questa opzione riscrive la cronologia sull'ultimo commit).
|
Per un impegno locale
git reset --soft HEAD ~ 1
o se non ricordi esattamente in quale commit si trova, potresti usare
git rm --cached
Per un impegno spinto
Il modo corretto per rimuovere i file dalla cronologia del repository è usare git filter-branch. Questo è,
git filter-branch --index-filter 'git rm --cached ' HEAD
Ma ti consiglio di usare questo comando con attenzione. Maggiori informazioni sulla pagina del manuale di git-filter-branch (1).
|
Per ripristinare la revisione precedente, eliminando definitivamente tutte le modifiche non salvate:
git reset --hard HEAD ~ 1
|
COSA USARE, reset --soft o reset --hard?
Sto solo aggiungendo due centesimi per la risposta di @ Kyralessa:
Se non sei sicuro di cosa usare, scegli --soft (ho usato questa convenzione per ricordarlo --soft for safe).
Perché ?
Se scegli --hard per sbaglio PERDERE le modifiche come non era prima.
Se scegli --soft per errore puoi ottenere gli stessi risultati di --hard applicando comandi aggiuntivi
git reset HEAD file.html
git checkout - file.html
Esempio completo
echo "alcune modifiche ..."> file.html
git add file.html
git commit -m "commit sbagliato"
# Ho bisogno di resettare
git reset --hard HEAD ~ 1 (annulla le modifiche)
# O
git reset --soft HEAD ~ 1 # Torna allo staging
git reimposta HEAD file.html # torna alla directory di lavoro
git checkout - file.html # annulla le modifiche
I riconoscimenti vanno a @Kyralessa.
|
1
2
3
Il prossimo
Domanda molto attiva. Guadagna 10 punti reputazione per rispondere a questa domanda. Il requisito di reputazione aiuta a proteggere questa domanda dallo spam e dalle attività di mancata risposta.
Non è la risposta che stai cercando? Sfoglia altre domande contrassegnate con git version-control git-commit undo o fai la tua domanda.